/**
 * 2022年2月5日
 * 其内部运行机制是判断在其原型链中能否找到该类型的原型
 * `instanceof`**只能正确判断引用数据类型**，而不能判断基本数据类型。
 * `instanceof` 运算符可以用来测试一个对象在其原型链中是否存在一个构造函数的 `prototype` 属性
 */

function instanceOf(father, children){
  const fp = father.prototype
  const cp = children.__proto__

  while(cp){
    if(cp = fp){
      return true
    }
    cp = cp.__proto__
  }

  return false

}


function myInstanceof(left, right) {
  // 获取对象的原型
  let proto = Object.getPrototypeOf(left)
  // 获取构造函数的 prototype 对象
  let prototype = right.prototype; 
 
  // 判断构造函数的 prototype 对象是否在对象的原型链上
  while (true) {
    if (!proto) return false;
    if (proto === prototype) return true;
    // 如果没有找到，就继续从其原型上找，Object.getPrototypeOf方法用来获取指定对象的原型
    proto = Object.getPrototypeOf(proto);
  }
}


